#ifndef CLIENT_H
#define CLIENT_H

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <time.h>
#include <sys/wait.h>
#include <dirent.h>
#include <syslog.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <ctype.h>


#define NAMELENTH 12
#define PASSWORDLENGTH 18

/*
 ***********************************客户端框架*********************************
 */
//利用枚举值指定命令类型
enum command
{
    RM,LS,MKDIR,PUTS,GETS,PWD,CD,EXIT,LOGOUT, LOGIN,REGIST,ERR
};
//传输协议结构体
struct client_info
{
    enum command command;
    //键值对的个数
    int num;
    //利用键值对以及&分割命令
    char protocol[1000];//"name=****&path=*****&param=****"以后可能有不止三个目前先这样传输param表示参数,比如 cd test 中的test
};
//本地信息存储结构体
struct login_status
{
    //账号是否登录
    bool login;
    //用户名
    char name[NAMELENTH];
    //密码结构体存储
    char password[PASSWORDLENGTH];
    //用户当前所在路径
    char path[100];
    char token[256];
};

struct upload_info {
    struct client_info client_info;
  char filename[100];     // 文件名
  char *ip;               // IP 地址
  char *port;             // 端口
  enum command command;
};

struct download_info {
    struct client_info client_info;
  char filename[100];     // 文件名
  char *ip;               // IP 地址
  char *port;             // 端口
  enum command command;
};


#include"config.h"
#include"log.h"
#include"commandClient.h"
#include"public.h"

//建立soket链接
int connect_serve(const char *ip,const char *port,int * socket_fd);

//标准输出的形式
int stan_print();

//读取指令,登录时选项
int get_choose(int *choose);

//执行指令,执行登录的选择
int execute_choose(int choose,struct login_status* stat,int* status,struct client_info* info,int socket_fd);

//拼接protocol
int joint_stdin(struct login_status* stat,struct client_info* info);

//读取标准输入
int get_stdin(struct login_status* stat,struct client_info* info);

//分割命令
int depart_command(struct client_info* info , char* msg);


//命令匹配
int ensure_command(const char* command,struct client_info* info);

//处理info结构体
int getparama(const struct client_info* info,char * msg);


#endif
